﻿using System;
using System.Windows.Forms;

namespace SisVet.Utils
{
    public class FormatacaoDeTexto
    {
        private char _tecla;
        private string _palavra;
        private Int32 _fator = 1;

        private void RetiraCaractere(char carac)
        {
            //retirando caractere da string
            string[] campos = _palavra.Split(carac);
            _palavra = Convert.ToDouble(string.Concat(campos)).ToString();
        }

        private void AcrescentaZeros(int normal, int backspace)
        {
            //acrescentado zeros a string
            while ((_palavra.Length < normal) || ((_palavra.Length < backspace) && (_tecla == (char) Keys.Back)))
            {
                _palavra = "0" + _palavra;
            }
        }

        private void RetornaFator()
        {
            //compara se backspace
            if (_tecla == (char) Keys.Back)
                _fator = 3;
        }

        public void LimpaNumero(char simbolo, int min, int max)
        {
            //chama funcao para retirada de caracter e insercao de zeros
            RetiraCaractere(simbolo);
            AcrescentaZeros(min, max);
            RetornaFator();
        }

        //funcao recebe quantidade de parter do numero, inicio e quantidade de caracteres de cada parte dentro da string, caracter e efetua qualquer tipo de mascara.
        private void MascaraQualquer(Int32 quantidade, string[,] limites)
        {
            string partes = "";
            Int32 contador = 0;
            while (contador < quantidade)
            {
                partes +=
                    _palavra.Substring(Convert.ToInt32(limites[contador, 0]), Convert.ToInt32(limites[contador, 1])) +
                    limites[contador, 2];
                contador = contador + 1;
            }
            _palavra = partes;
        }

        //METODODS PUBLICOS----
        public void RecebeTecla(char x)
        {
            _tecla = x;
        }

        public void RecebePalavra(string y)
        {
            _palavra = y;
        }

        //metodo recebe caracter e retorna falso se numero
        public bool MascaraNumero(Int32 maximo)
        {
            if ((!char.IsNumber(_tecla) || (_palavra.Length >= maximo && Convert.ToInt32(_palavra.Substring(0, 1)) != 0)) &&
                (_tecla != (char) Keys.Back))
                return true;
            else
                return false;
        }

        //aplica a mascara no formato 00000-000
        public string MascaraCep()
        {
            LimpaNumero('-', 7, 9);
            string[,] partes = {{"0", "5", "-"}, {"5", Convert.ToString(1 + _fator), ""}};
            MascaraQualquer(2, partes);
            return _palavra;
        }

        //aplica a mascara no formato 00000000/0000-00
        public string MascaraCnpj()
        {
            string[] camposAux;
            _palavra = string.Concat(camposAux = _palavra.Split('/'));
            LimpaNumero('-', 13, 15);
            string[,] partes = {{"0", "8", "/"}, {"8", "4", "-"}, {"12", Convert.ToString(1*_fator), ""}};
            MascaraQualquer(3, partes);
            return _palavra;
        }
    }
}
